<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Pin: Pin System Call API</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">Pin
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.17 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'Search');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="summary">
<a href="#typedef-members">Typedefs</a> &#124;
<a href="#func-members">Functions</a>  </div>
  <div class="headertitle">
<div class="title">Pin System Call API<div class="ingroups"><a class="el" href="group__API__REF.html">Instrumentation API Reference</a></div></div>  </div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
Typedefs</h2></td></tr>
<tr class="memitem:gab34ef13ce96444da49a29c28f2893b21"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#gab34ef13ce96444da49a29c28f2893b21">SYSCALL_ENTRY_CALLBACK</a>) (<a class="el" href="group__THREADS.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, <a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std, VOID *v)</td></tr>
<tr class="separator:gab34ef13ce96444da49a29c28f2893b21"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga47febb06d8fd5728e7ccba121b8ab56f"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#ga47febb06d8fd5728e7ccba121b8ab56f">SYSCALL_EXIT_CALLBACK</a>) (<a class="el" href="group__THREADS.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, <a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std, VOID *v)</td></tr>
<tr class="separator:ga47febb06d8fd5728e7ccba121b8ab56f"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:ga8dc6b426fa6483242eb9ce5699671bf1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga80ecde10e25aa90133f29e875d21d61d">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#ga8dc6b426fa6483242eb9ce5699671bf1">PIN_AddSyscallEntryFunction</a> (<a class="el" href="group__SYSCALL.html#gab34ef13ce96444da49a29c28f2893b21">SYSCALL_ENTRY_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga8dc6b426fa6483242eb9ce5699671bf1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga86cd4ab2afd3af8435cdea496616d96c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga80ecde10e25aa90133f29e875d21d61d">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#ga86cd4ab2afd3af8435cdea496616d96c">PIN_AddSyscallExitFunction</a> (<a class="el" href="group__SYSCALL.html#ga47febb06d8fd5728e7ccba121b8ab56f">SYSCALL_EXIT_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga86cd4ab2afd3af8435cdea496616d96c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad9d546e07b4243cd28f5c3cbcfafc4eb"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#gad9d546e07b4243cd28f5c3cbcfafc4eb">PIN_SetSyscallArgument</a> (<a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std, UINT32 argNum, ADDRINT val)</td></tr>
<tr class="separator:gad9d546e07b4243cd28f5c3cbcfafc4eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga9f3bad50c8987db46b687193fe900fa6"><td class="memItemLeft" align="right" valign="top">ADDRINT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#ga9f3bad50c8987db46b687193fe900fa6">PIN_GetSyscallArgument</a> (const <a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std, UINT32 argNum)</td></tr>
<tr class="separator:ga9f3bad50c8987db46b687193fe900fa6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gab045c7dedca9b8b63a9a339e9889cdc8"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#gab045c7dedca9b8b63a9a339e9889cdc8">PIN_SetSyscallNumber</a> (<a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std, ADDRINT val)</td></tr>
<tr class="separator:gab045c7dedca9b8b63a9a339e9889cdc8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gab5648a015d935b4df7395c2b9f16707b"><td class="memItemLeft" align="right" valign="top">ADDRINT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#gab5648a015d935b4df7395c2b9f16707b">PIN_GetSyscallNumber</a> (const <a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std)</td></tr>
<tr class="separator:gab5648a015d935b4df7395c2b9f16707b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaee394d106296c67ebe55c2a76736e1e9"><td class="memItemLeft" align="right" valign="top">ADDRINT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#gaee394d106296c67ebe55c2a76736e1e9">PIN_GetSyscallReturn</a> (const <a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std)</td></tr>
<tr class="separator:gaee394d106296c67ebe55c2a76736e1e9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga196c129374709623b01eb3b676bb4f6e"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#ga196c129374709623b01eb3b676bb4f6e">PIN_SetSyscallReturn</a> (<a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std, ADDRINT val)</td></tr>
<tr class="separator:ga196c129374709623b01eb3b676bb4f6e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga5e0f238ac44ece7809f4ca6f834785b4"><td class="memItemLeft" align="right" valign="top">ADDRINT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#ga5e0f238ac44ece7809f4ca6f834785b4">PIN_GetSyscallErrno</a> (const <a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std)</td></tr>
<tr class="separator:ga5e0f238ac44ece7809f4ca6f834785b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga4ba15e53ecb01c9a954abf1e60f2a07c"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#ga4ba15e53ecb01c9a954abf1e60f2a07c">PIN_SetSyscallErrno</a> (<a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std, ADDRINT val)</td></tr>
<tr class="separator:ga4ba15e53ecb01c9a954abf1e60f2a07c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaefc2f308b1fc73ad2b1bfd1a7c41512c"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#gaefc2f308b1fc73ad2b1bfd1a7c41512c">PIN_ReplaySyscallEntry</a> (<a class="el" href="group__THREADS.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> tid, <a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std)</td></tr>
<tr class="separator:gaefc2f308b1fc73ad2b1bfd1a7c41512c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga62ed9a93aa5739f576ec49b39c8e699c"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__SYSCALL.html#ga62ed9a93aa5739f576ec49b39c8e699c">PIN_ReplaySyscallExit</a> (<a class="el" href="group__THREADS.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> tid, <a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std)</td></tr>
<tr class="separator:ga62ed9a93aa5739f576ec49b39c8e699c"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<p>These APIs provide Pin support for extracting information about, or modifying, system calls made by the pinned program. </p>
<h2 class="groupheader">Typedef Documentation</h2>
<a id="gab34ef13ce96444da49a29c28f2893b21"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gab34ef13ce96444da49a29c28f2893b21">&#9670;&nbsp;</a></span>SYSCALL_ENTRY_CALLBACK</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">typedef VOID(* SYSCALL_ENTRY_CALLBACK) (<a class="el" href="group__THREADS.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, <a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std, VOID *v)</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Call-back function before execution of a system call.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">threadIndex</td><td>The Pin thread ID of the thread that executes the system call. </td></tr>
    <tr><td class="paramdir">[in,out]</td><td class="paramname">ctxt</td><td>Application's register state immediately before execution of the system call. The tool may change this and affect the new register state. </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">std</td><td>The system calling standard. </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<a id="ga47febb06d8fd5728e7ccba121b8ab56f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga47febb06d8fd5728e7ccba121b8ab56f">&#9670;&nbsp;</a></span>SYSCALL_EXIT_CALLBACK</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">typedef VOID(* SYSCALL_EXIT_CALLBACK) (<a class="el" href="group__THREADS.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, <a class="el" href="structCONTEXT.html">CONTEXT</a> *ctxt, <a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a> std, VOID *v)</td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Call-back function after execution of a system call.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">threadIndex</td><td>The Pin thread ID of the thread that executed the system call. </td></tr>
    <tr><td class="paramdir">[in,out]</td><td class="paramname">ctxt</td><td>Application's register state immediately after execution of the system call.The tool may change this and affect the new register state. </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">std</td><td>The system calling standard. </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
  </table>
  </dd>
</dl>

</div>
</div>
<h2 class="groupheader">Function Documentation</h2>
<a id="ga8dc6b426fa6483242eb9ce5699671bf1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga8dc6b426fa6483242eb9ce5699671bf1">&#9670;&nbsp;</a></span>PIN_AddSyscallEntryFunction()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga80ecde10e25aa90133f29e875d21d61d">PIN_CALLBACK</a> PIN_AddSyscallEntryFunction </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="group__SYSCALL.html#gab34ef13ce96444da49a29c28f2893b21">SYSCALL_ENTRY_CALLBACK</a>&#160;</td>
          <td class="paramname"><em>fun</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">VOID *&#160;</td>
          <td class="paramname"><em>val</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Register a notification function that is called immediately before execution of a system call.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Function to be called immediately before execution of a system call. </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the function.</td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.. </dd>
<dd>
In Linux systems with kernel 5.3 and above, callbacks will be called also when branching to vsyscall area.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br  />
<b>O/S</b>: Linux, Windows<br  />
<b>CPU:</b> All<br  />
</dd></dl>

</div>
</div>
<a id="ga86cd4ab2afd3af8435cdea496616d96c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga86cd4ab2afd3af8435cdea496616d96c">&#9670;&nbsp;</a></span>PIN_AddSyscallExitFunction()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga80ecde10e25aa90133f29e875d21d61d">PIN_CALLBACK</a> PIN_AddSyscallExitFunction </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="group__SYSCALL.html#ga47febb06d8fd5728e7ccba121b8ab56f">SYSCALL_EXIT_CALLBACK</a>&#160;</td>
          <td class="paramname"><em>fun</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">VOID *&#160;</td>
          <td class="paramname"><em>val</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Register a notification function that is called immediately after execution of a system call. <br  />
The notification is called for each system call when it returns to the application, even if the system call changes control flow and does not fall through to the next instruction. <br  />
 </p><dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Function to be called immediately after execution of a system call. </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the function.</td></tr>
  </table>
  </dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>In order to monitor all possible control transfers from the operating system to the user mode application, the tool has to register both a SYSCALL_EXIT_CALLBACK and a CONTEXT_CHANGE_CALLBACK callback functions. This can be done using the corresponding registration functions: <a class="el" href="group__SYSCALL.html#ga86cd4ab2afd3af8435cdea496616d96c">PIN_AddSyscallExitFunction()</a> and <a class="el" href="group__PIN__CONTROL.html#ga1cc0f28140cb83a035ebabdddf81861f">PIN_AddContextChangeFunction()</a>.<br  />
When a system call returns to the application, the tool receives the SYSCALL_EXIT_CALLBACK notification. Usually, this callback immediately follows the corresponding SYSCALL_ENTRY_CALLBACK notification and there is no application code executed between these two events. However, some (Windows) system calls can be interrupted by a system event (APC, Windows callback, exception) before they return to the application. If this happens, the tool receives the corresponding CONTEXT_CHANGE_CALLBACK notification just before the (user mode) handler of the system event gets executed. Eventually, when the event handler and the interrupted system call are completed, the SYSCALL_EXIT_CALLBACK notification is delivered to the tool.</dd></dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API. </dd>
<dd>
In Linux systems with kernel 5.3 and above, callbacks will be called also when branching to vsyscall area.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br  />
<b>O/S</b>: Linux, Windows<br  />
<b>CPU:</b> All<br  />
</dd></dl>

</div>
</div>
<a id="ga9f3bad50c8987db46b687193fe900fa6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga9f3bad50c8987db46b687193fe900fa6">&#9670;&nbsp;</a></span>PIN_GetSyscallArgument()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">ADDRINT PIN_GetSyscallArgument </td>
          <td>(</td>
          <td class="paramtype">const <a class="el" href="structCONTEXT.html">CONTEXT</a> *&#160;</td>
          <td class="paramname"><em>ctxt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a>&#160;</td>
          <td class="paramname"><em>std</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">UINT32&#160;</td>
          <td class="paramname"><em>argNum</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Get the value of the argument of the system call to be executed in the specified context.<br  />
It is a user's responsibility to make sure that the specified context and the current memory content represent the state of a system call before execution. For example, this function can be safely used in the scope of <a class="el" href="group__SYSCALL.html#gab34ef13ce96444da49a29c28f2893b21">SYSCALL_ENTRY_CALLBACK</a>. Applying this function to an inappropriate context results in undefined behavior and even may cause crash on systems in which system call arguments are located in memory.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>context before the system call execution </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">std</td><td>system calling standard </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">argNum</td><td>ordinal number of the argument whose value is requested. Ordinal numbers start from zero for the first argument </td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>value of the argument</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br  />
<b>O/S</b>: Linux, Windows &amp; macOS*<br  />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br  />
</dd></dl>

</div>
</div>
<a id="ga5e0f238ac44ece7809f4ca6f834785b4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga5e0f238ac44ece7809f4ca6f834785b4">&#9670;&nbsp;</a></span>PIN_GetSyscallErrno()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">ADDRINT PIN_GetSyscallErrno </td>
          <td>(</td>
          <td class="paramtype">const <a class="el" href="structCONTEXT.html">CONTEXT</a> *&#160;</td>
          <td class="paramname"><em>ctxt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a>&#160;</td>
          <td class="paramname"><em>std</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Get the error code of the system call which is just returned with the specified context.<br  />
It is a user's responsibility to make sure that the specified context represents the state of a system call after execution. For example, this function can be safely used in the scope of <a class="el" href="group__SYSCALL.html#ga47febb06d8fd5728e7ccba121b8ab56f">SYSCALL_EXIT_CALLBACK</a>. Applying this function to an inappropriate context results in undefined behavior.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>context after the system call execution </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">std</td><td>system calling standard </td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>error code, if the system call failed;<br  />
 zero, if the system call succeeded</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br  />
<b>O/S</b>: Linux, Windows &amp; macOS*<br  />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br  />
</dd></dl>

</div>
</div>
<a id="gab5648a015d935b4df7395c2b9f16707b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gab5648a015d935b4df7395c2b9f16707b">&#9670;&nbsp;</a></span>PIN_GetSyscallNumber()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">ADDRINT PIN_GetSyscallNumber </td>
          <td>(</td>
          <td class="paramtype">const <a class="el" href="structCONTEXT.html">CONTEXT</a> *&#160;</td>
          <td class="paramname"><em>ctxt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a>&#160;</td>
          <td class="paramname"><em>std</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Get the number (ID) of the system call to be executed in the specified context.<br  />
It is a user's responsibility to make sure that the specified context represents the state of a system call before execution. For example, this function can be safely used in the scope of <a class="el" href="group__SYSCALL.html#gab34ef13ce96444da49a29c28f2893b21">SYSCALL_ENTRY_CALLBACK</a>, but not in a SYSCALL_EXIT_CALLBACK. Applying this function to an inappropriate context results in undefined behavior.</p>
<p>If you need the system call number in a SYSCALL_EXIT_CALLBACK, you should use a SYSCALL_ENTRY_CALLBACK to save the system call number into thread local storage so that you can get it from there in your SYSCALL_EXIT_CALLBACK. Beware, though of interruptable system calls, to handle those you will need to worry about other context changes (see the discussion in <a class="el" href="group__SYSCALL.html#ga86cd4ab2afd3af8435cdea496616d96c">PIN_AddSyscallExitFunction</a> ).</p>
<p>In Linux systems with kernel 5.3 and above, calling this API while jumping to vsyscall area will return special number - VSYSCALL_NR.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>context before the system call execution </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">std</td><td>system calling standard </td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>system call number</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br  />
<b>O/S</b>: Linux, Windows &amp; macOS*<br  />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br  />
</dd></dl>

</div>
</div>
<a id="gaee394d106296c67ebe55c2a76736e1e9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaee394d106296c67ebe55c2a76736e1e9">&#9670;&nbsp;</a></span>PIN_GetSyscallReturn()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">ADDRINT PIN_GetSyscallReturn </td>
          <td>(</td>
          <td class="paramtype">const <a class="el" href="structCONTEXT.html">CONTEXT</a> *&#160;</td>
          <td class="paramname"><em>ctxt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a>&#160;</td>
          <td class="paramname"><em>std</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Get the return value of the system call which has just returned with the specified context.<br  />
It is a user's responsibility to make sure that the specified context represents the state of a system call after execution. For example, this function can be safely used in the scope of <a class="el" href="group__SYSCALL.html#ga47febb06d8fd5728e7ccba121b8ab56f">SYSCALL_EXIT_CALLBACK</a>. Applying this function to an inappropriate context results in undefined behavior.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>context after the system call execution </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">std</td><td>system calling standard </td></tr>
  </table>
  </dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>return value of the system call. <br  />
 On Linux and macOS* the function returns -1 if the system call failed</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br  />
<b>O/S</b>: Linux, Windows &amp; macOS*<br  />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br  />
</dd></dl>

</div>
</div>
<a id="gaefc2f308b1fc73ad2b1bfd1a7c41512c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaefc2f308b1fc73ad2b1bfd1a7c41512c">&#9670;&nbsp;</a></span>PIN_ReplaySyscallEntry()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">VOID PIN_ReplaySyscallEntry </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="group__THREADS.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a>&#160;</td>
          <td class="paramname"><em>tid</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structCONTEXT.html">CONTEXT</a> *&#160;</td>
          <td class="paramname"><em>ctxt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a>&#160;</td>
          <td class="paramname"><em>std</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Additional client side interface to pin vm containing the interfaces useful for a replay tool. These mainly allow a PinTool to request that Pin execute callbacks associated with specific events.</p>
<p>This API is intended for use by tools that replay the execution of an application and need to behave as if a system call has been made, calling all callbacks registered with PIN_AddSysCallEntry function. However, no system call is actually performed.</p>
<p>This API can be called from an analysis routine or a replacement routine, but not from a call-back.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">tid</td><td>The ID of the thread in which the system call appears to execute. </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">from</td><td>The register state at the point when the system call appears to execute. </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">std</td><td>The calling standard of the system call.</td></tr>
  </table>
  </dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>The vm and pin client locks are obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br  />
<b>O/S</b>: Linux,Windows,BSD<br  />
<b>CPU:</b> All<br  />
</dd></dl>

</div>
</div>
<a id="ga62ed9a93aa5739f576ec49b39c8e699c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga62ed9a93aa5739f576ec49b39c8e699c">&#9670;&nbsp;</a></span>PIN_ReplaySyscallExit()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">VOID PIN_ReplaySyscallExit </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="group__THREADS.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a>&#160;</td>
          <td class="paramname"><em>tid</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="structCONTEXT.html">CONTEXT</a> *&#160;</td>
          <td class="paramname"><em>ctxt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a>&#160;</td>
          <td class="paramname"><em>std</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<p>This API is intended for use by tools that replay the execution of an application and need to behave as if a system call has been made, calling all callbacks registered with PIN_AddSysCallExit function. However, no system call is actually performed.</p>
<p>This API can be called from an analysis routine or a replacement routine, but not from a call-back.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">tid</td><td>The ID of the thread in which the system call appears to execute. </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">from</td><td>The register state at the point after the system call has executed. </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">std</td><td>The calling standard of the system call.</td></tr>
  </table>
  </dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>The vm and pin client locks are obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br  />
<b>O/S</b>: Linux,Windows,BSD<br  />
<b>CPU:</b> All<br  />
</dd></dl>

</div>
</div>
<a id="gad9d546e07b4243cd28f5c3cbcfafc4eb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gad9d546e07b4243cd28f5c3cbcfafc4eb">&#9670;&nbsp;</a></span>PIN_SetSyscallArgument()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">VOID PIN_SetSyscallArgument </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structCONTEXT.html">CONTEXT</a> *&#160;</td>
          <td class="paramname"><em>ctxt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a>&#160;</td>
          <td class="paramname"><em>std</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">UINT32&#160;</td>
          <td class="paramname"><em>argNum</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">ADDRINT&#160;</td>
          <td class="paramname"><em>val</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Set the given value for the argument of the system call to be executed in the specified context.<br  />
It is a user's responsibility to make sure that the specified context and the current memory content represent the state of a system call before execution. For example, this function can be safely used in the scope of <a class="el" href="group__SYSCALL.html#gab34ef13ce96444da49a29c28f2893b21">SYSCALL_ENTRY_CALLBACK</a>. Applying this function to an inappropriate context results in undefined behavior and even may cause crash on systems in which system call arguments are located in memory.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in,out]</td><td class="paramname">ctxt</td><td>context before the system call execution </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">std</td><td>system calling standard </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">argNum</td><td>ordinal number of the argument whose value is to be set. Ordinal numbers start from zero for the first argument </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>new value of the argument</td></tr>
  </table>
  </dd>
</dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br  />
<b>O/S</b>: Linux, Windows &amp; macOS*<br  />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br  />
</dd></dl>

</div>
</div>
<a id="ga4ba15e53ecb01c9a954abf1e60f2a07c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga4ba15e53ecb01c9a954abf1e60f2a07c">&#9670;&nbsp;</a></span>PIN_SetSyscallErrno()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">VOID PIN_SetSyscallErrno </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structCONTEXT.html">CONTEXT</a> *&#160;</td>
          <td class="paramname"><em>ctxt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a>&#160;</td>
          <td class="paramname"><em>std</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">ADDRINT&#160;</td>
          <td class="paramname"><em>val</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Set the error code of the system call which is just returned with the specified context.<br  />
It is a user's responsibility to make sure that the specified context represents the state of a system call after execution. For example, this function can be safely used in the scope of <a class="el" href="group__SYSCALL.html#ga47febb06d8fd5728e7ccba121b8ab56f">SYSCALL_EXIT_CALLBACK</a>. Applying this function to an inappropriate context results in undefined behavior.<br  />
 The user should set in Linux a negative error value.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>context after the system call execution </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">std</td><td>system calling standard </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>the error value to set for the syscall</td></tr>
  </table>
  </dd>
</dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br  />
<b>O/S</b>: Linux, Windows &amp; macOS*<br  />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br  />
</dd></dl>

</div>
</div>
<a id="gab045c7dedca9b8b63a9a339e9889cdc8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gab045c7dedca9b8b63a9a339e9889cdc8">&#9670;&nbsp;</a></span>PIN_SetSyscallNumber()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">VOID PIN_SetSyscallNumber </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structCONTEXT.html">CONTEXT</a> *&#160;</td>
          <td class="paramname"><em>ctxt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a>&#160;</td>
          <td class="paramname"><em>std</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">ADDRINT&#160;</td>
          <td class="paramname"><em>val</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Set the number (ID) of the system call to be executed in the specified context.<br  />
It is a user's responsibility to make sure that the specified context represents the state of a system call before execution. For example, this function can be safely used in the scope of <a class="el" href="group__SYSCALL.html#gab34ef13ce96444da49a29c28f2893b21">SYSCALL_ENTRY_CALLBACK</a>. Applying this function to an inappropriate context results in undefined behavior.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>context before the system call execution </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">std</td><td>system calling standard </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>new system call number</td></tr>
  </table>
  </dd>
</dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br  />
<b>O/S</b>: Linux, Windows &amp; macOS*<br  />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br  />
</dd></dl>

</div>
</div>
<a id="ga196c129374709623b01eb3b676bb4f6e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga196c129374709623b01eb3b676bb4f6e">&#9670;&nbsp;</a></span>PIN_SetSyscallReturn()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">VOID PIN_SetSyscallReturn </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="structCONTEXT.html">CONTEXT</a> *&#160;</td>
          <td class="paramname"><em>ctxt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="group__INS__INSPECTION.html#gaf903f1f8ddcb9710d191943763e6474a">SYSCALL_STANDARD</a>&#160;</td>
          <td class="paramname"><em>std</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">ADDRINT&#160;</td>
          <td class="paramname"><em>val</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">
<p>Set the return value of the system call which has just returned with the specified context.<br  />
It is a user's responsibility to make sure that the specified context represents the state of a system call after execution. For example, this function can be safely used in the scope of <a class="el" href="group__SYSCALL.html#ga47febb06d8fd5728e7ccba121b8ab56f">SYSCALL_EXIT_CALLBACK</a>. Applying this function to an inappropriate context results in undefined behavior.</p>
<dl class="params"><dt>Parameters</dt><dd>
  <table class="params">
    <tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>context after the system call execution </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">std</td><td>system calling standard </td></tr>
    <tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>the return value to set for the syscall</td></tr>
  </table>
  </dd>
</dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br  />
<b>O/S</b>: Linux, Windows &amp; macOS*<br  />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br  />
</dd></dl>

</div>
</div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.17
</small></address>
</body>
</html>
